# _*_ coding:utf-8 _*_
# 开发团队: Mavericks
# 开发人员：Maverick·Ming
# 开发IDE： PyCharm
#   项目名：HelloWorld
#   文件名：5.08 高阶函数.py
# 开发时间：2021/3/24 22:23

"""
高阶函数
"""
# 高阶函数(函数里嵌套函数)
# 接收函数作为参数，或者将函数作为返回值的函数是高阶函数（输入函数或者输出函数）

# 创建一个列表(需要筛选的源列表)
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


# 定义一个函数，判断一个数的奇偶
def ji_ou(n):
    if n % 2 == 0:
        return True
    return False


# 定义一个函数
#   可以将制定列表中的所有偶数，保存到一个新的列表中返回
def ou_shu(lst):
    """
    ou_shu()可以将指定列表中的所有偶数取出，存到新列表中返回
    :param lst: 要进行筛选的源列表
    :return:
    """
    # 创建一个新列表list
    new_list = []
    # 对列表进行筛选
    for n in lst:
        # 判断n的奇偶
        if ji_ou(n):
            new_list.append(n)
    # 返回新列表
    return new_list


# print(ou_shu(l), type(ou_shu(l)))

"""
filter() 过滤函数
"""
# filter()
# 可以从序列中，过滤出符合条件的元素，保存到一个新的序列中
# 参数：
# 1.函数，根据该函数来过滤序列（可迭代的结构）
# 2.需要过滤的序列（可迭代的结构）
# 返回值：
#   过滤后的新序列(可迭代的结构）
print(list(filter(ji_ou, l)))  # filter object 结构、可迭代结构

# ji_ou函数对象作为参数传递进fitler函数中
#   而ji_ou实际上只有一个作用，就是作为filter()的参数
#   filter()调用完之后，ji_ou就已经没有利用价值了

"""
lambda 匿名函数
"""
# 匿名函数 lambda 函数表达式
#   lambda函数表达式专门用来创建一些简单的函数，他是函数创建的又一种方式
# 语法：
#   lambda 参数列表 : 返回值
# 匿名函数一般作为参数使用，其他地方一般不会频繁使用


# 普通写法：求两数和
def fn(a, b):
    return a + b


print(fn(123, 456))


# lambda 写法：求两数之和
# print(lambda a, b : a + b)
# print((lambda a, b: a + b)(10, 20))
# 一般不会这么用

# 可以将匿名函数赋值给某变量
# fn6 = lambda a, b: a + b
# print(fn6(10, 20))
# 一般也不会这么用

# 因为代码代码块只需要用一次，用完从内存中消去，不会占用空间
# 过滤出3倍数的值
r = filter(lambda i: i % 3 == 0, l)
print(list(r))


"""
map() 
"""
# map()函数可以对可迭代对象中的所有元素做指定操作，然后将其添加到一个新的对象中返回
r = map(lambda i : i ** 2, l)
print(list(r))


"""
sort()
"""
# 该方法用来对列表的元素进行排序
# sort() 默认比较列表中元素的大小（首字母大小）
# 但sort()可以接收一个关键字参数， key
#   key需要一个函数作为参数，当设置了函数作为参数
#   每次都会以列表中的一个元素作为参数来调用函数，并且使用函数的返回值来比较大小
l = ['bb', 'aaaa', 'c', 'ddddd', 'fff']
# l.sort()
# key 只是比较时转换，不影响源列表
# l.sort(key=len)  # 比较元素长度
# l.sort(key=str)  # 将元素转换为字符串比较
l = [2, '5', 1, '3', '4', 6]
print('排序前l:', l)
print('排序时l:', l.sort(key=int))  # 将元素转换为整型比较
print('排序后l:', l)

"""
sorted() 
"""
# sorted()的用法与sort()基本一致，不同的是sorted()可以对任意序列进行排序
#   使用sorted排序不会影响原来的对象，而是返回一个新对象
l = [2, '5', 1, '3', '4', 6]
# l = "1238584343063288357124"
print('排序前l:', l)
print('排序时l:', sorted(l, key=int))
print('排序后l:', l)

